<!DOCTYPE html>
<html>
<head>
    <title>匿名函数，闭包</title>
</head>
<body>
<script>

/*(function(){            //自我执行
    alert("xx");
})();

function(){             //少个括号，出错
    alert("xx");
}();

var kk = function(){      //自我执行，如果赋给一个变量，不出错      
    alert("kk");
}();
*/

/*
//循环里的匿名函数取值问题
function box(){
    var arr=[];
    for(var i=0; i<5; i++){
        //arr[0]=0,arr[1]=1...arr[4]=4
        arr[i] = function(){    
            return i;
        };
    }
    //循环已经执行完毕了，i最终是4++=5,那么最终就是5
    return arr;
}

//alert(box());
// alert(box()[0]);

var b = box();
for(var i=0; i<b.length; i++){
    console.log(b[i]());  //5 5 5 5 5 
}

//执行b=box();的时候，arr[0..4]保存的都是一个匿名函数function(){ return i;}
//下面的b[i]()就是执行b[i]里的匿名函数，匿名函数并没有自我执行，等到调用的时候，box()已执行完毕，i 早已变成5，所
// 以最终的结果就是5 个5。*/


//----------------------------------------
/*function box0(){    //方法0:直接赋值
    var arr=[];
    for(var i=0; i<5; i++){
        //arr[0]=0,arr[1]=1...arr[4]=4
        arr[i] = i;
    }
    return arr;
}

var b = box0();
for(var i=0; i<b.length; i++){
    alert(b[i]);  //0 1 2 3 4 
}*/
//-----------------------------------------



function box1(){  //方法1:自我及时执行匿名函数
    var arr=[];
    for(var i=0; i<5; i++){
        //arr[0]=0,arr[1]=1...arr[4]=4
        // arr[i] = (function(){    
        //     return i;
        // })();
        arr[i] = (function(num){    
            return num;
        })(i);
    }
    return arr;
}
//alert(box());
// alert(box()[0]);
var b = box1();
for(var i=0; i<b.length; i++){
    console.log(b[i]);  //0 1 2 3 4
}

//我们让匿名函数进行自我执行，导致最终返回给a[i]的是数组而不是函数了。
// 最终导致b[0]-b[4]中保留了0,1,2,3,4 的值。


//---------------------------------------------
/*function box2(){    //方法2:闭包实现
    var arr=[];
    for(var i=0; i<5; i++){
        arr[i] = function(num){   
            //num其实在这里 
            return function(){//因为闭包可以将变量驻留在内存中
                return num;
            }
        }(i);
    }
    return arr;
}

var b = box2();
console.log(b);//[function, function, function, function, function]
console.log(b[0]);//function (){ return num;} 

for(var i=0; i<b.length; i++){
    console.log(b[i]());  //0 1 2 3 4
}

//我们通过匿名函数自我执行，立即把结果赋值给a[i]。每一个i，是调用方通过按值传递的，所以最终返回的都是指定的递增的i。而不是box()函数里的i。*/

/*function box3(){    //方法3:闭包实现
    var arr=[];
    for(var i=0; i<5; i++){
        arr[i] = function(num){   
            return function(){
                return num;
            }
        };
    }
    return arr;
}

var b = box3();
console.log(b);
//[function, function, function, function, function]
console.log(b[0]);
// function (num){   
//     return function(){
//         return num;
//     }
// }
console.log(b[0](2013));
//function (){ return num;} 

for(var i=0; i<b.length; i++){
    console.log(b[i](i+100)());  //100 101 102 103 104
}*/

//方法2在执行box2的时候，arr就已经自我执行了，而且传的参数就是0..4，方法3我们在执行box的时候，arr没有自我执行，而是在调用的时候自我执行，手动传参
</script>
</body>
</html>